package com.redepronik.negosysres.seguridad.controller;

import static com.redepronik.negosys.utils.Utils.actualizar;
import static com.redepronik.negosys.utils.Utils.actualizarIva;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;

import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.service.IvaService;
import com.redepronik.negosys.invfac.service.ParametroService;
import com.redepronik.negosys.seguridad.entity.Menu;
import com.redepronik.negosys.seguridad.service.MenuService;
import com.redepronik.negosys.seguridad.service.UsuarioService;

@Controller
@Scope("session")
public class MenuBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	private MenuService menuService;

	@Autowired
	private ParametroService parametroService;

	@Autowired
	private IvaService ivaService;

	private MenuModel menuModel;
	private String nombreUsuario;

	public MenuBean() {
	}

	public void cargarMenu() {
		if (menuModel == null) {
			menuModel = new DefaultMenuModel();

			DefaultSubMenu subMenu1 = null;
			DefaultSubMenu subMenu2 = null;
			DefaultSubMenu subMenu3 = null;
			DefaultMenuItem menuItem = null;

			int padre1 = 0;
			int padre2 = 0;
			int padre3 = 0;

			List<Menu> listMenu = menuService
					.obtenerPorUsuario(SecurityContextHolder.getContext()
							.getAuthentication().getName());
			for (Menu menu2 : listMenu) {
				if (menu2.getVista().compareTo("-") == 0) {
					if (menu2.getNivel() == 1) {
						padre1 = menu2.getMenuid();
						subMenu1 = new DefaultSubMenu(menu2.getNombre());
						if (menu2.getIcono().compareTo("-") != 0) {
							subMenu1.setIcon(menu2.getIcono());
						}
						subMenu1.setStyleClass(menu2.getClase());

						menuModel.addElement(subMenu1);
					} else if (menu2.getNivel() == 2) {
						padre2 = menu2.getMenuid();
						subMenu2 = new DefaultSubMenu(menu2.getNombre());
						if (menu2.getIcono().compareTo("-") != 0) {
							subMenu2.setIcon(menu2.getIcono());
						}
						subMenu2.setStyleClass(menu2.getClase());

						subMenu1.addElement(subMenu2);
					} else if (menu2.getNivel() == 3) {
						padre3 = menu2.getMenuid();
						subMenu3 = new DefaultSubMenu(menu2.getNombre());
						if (menu2.getIcono().compareTo("-") != 0) {
							subMenu3.setIcon(menu2.getIcono());
						}
						subMenu3.setStyleClass(menu2.getClase());

						subMenu2.addElement(subMenu3);
					}
				} else {
					menuItem = new DefaultMenuItem(menu2.getNombre());
					menuItem.setUrl(menu2.getVista());
					if (menu2.getIcono().compareTo("-") != 0) {
						menuItem.setIcon(menu2.getIcono());
					}
					// menuItem.setStyle(menu2.getEstilo());
					// menuItem.setProcess("@this");

					menuItem.setAjax(true);
					menuItem.setUpdate("centro");
					if (padre1 == menu2.getPadre()) {
						subMenu1.addElement(menuItem);
					} else if (padre2 == menu2.getPadre()) {
						subMenu2.addElement(menuItem);
					} else if (padre3 == menu2.getPadre()) {
						subMenu3.addElement(menuItem);
					}
				}
			}
		}
	}

	public MenuModel getMenuModel() {
		return menuModel;
	}

	public String getNombreUsuario() {
		return nombreUsuario;
	}

	@PostConstruct
	public void init() {
		setNombreUsuario("BIENVENIDO: "
				+ usuarioService.obtenerPorLoginSimple(
						SecurityContextHolder.getContext().getAuthentication()
								.getName()).getNombre());
		cargarMenu();
		actualizar(parametroService.obtener());
		actualizarIva(ivaService.obtenerPorFecha(new Date()));
	}

	public void setMenuModel(MenuModel menuModel) {
		this.menuModel = menuModel;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

}